ReactのMain Concept:6. Handling Events
https://reactjs.org/docs/handling-events.html
ReactのMain Concept:5. State and Lifecycleの続き
React elementsのイベントハンドリングは、DOM要素のイベントハンドリングに似ている
ReactのeventはcamelCase
x onclick
o onClick
ハンドラに関数をそのまま渡せる
onClick={activateLasers}
「ブラウザのデフォルトの挙動」をさせないようにするとき、DOM要素のときにはfalseを返していたが、Reactの場合preventDefaultをつける必要がある
ブラウザのデフォルトの挙動とは
「formの中でsubmitボタンを押したらサーバに情報が送られる」みたいな挙動
他の例:Browser default actions
code:js
function ActionLink() {
function handleClick(e) {
e.preventDefault();
console.log('The link was clicked.');
}
return (
<a href="#" onClick={handleClick}>
Click me
</a>
);
}
イベントeはReactがつくったイベント(SyntheticEvent)で、W3Cの定義しているspecが実装されている
ユーザはこれを使えばクロスブラウザ対応を考えなくて良くなる
自前でやると標準外のDOMイベント( https://developer.mozilla.org/ja/docs/Web/Events )に対応する必要がある?
リスナーの登録
Reactを使った場合、(HTMLで)DOM elementを作成した後に、(JavaScriptで)addEventListenerを呼んでリスナーを追加するという典型的な処理は不要
elementが最初にレンダリングされるときにリスナーを渡すだけでよい
Componentを使ったときに、classのmethodにハンドラを登録する典型的なパターン
https://codepen.io/gaearon/pen/xEmzGg?editors=0010
イベントハンドラをmethodにする
(今回の場合は、handlerでthisを使うために、constructorでhandlerにthisをbindしている)
Reactに限らず、JavaScriptにおいて、class methodはデフォルトではbindされないため
ふつう、メソッドを()なしで呼んだ(onClick={this.handleClick})あとはメソッドをbindする必要がある
でもbindいちいち呼ぶのはめんどう…なにかいい方法はないんですか!?kadoyau.icon
React.icon 方法は2つある
1. public class fields syntaxを使うとclass fieldが正しくコールバックにbindされる
ただしexperimental syntax
Create React Appではデフォで有効
2. callbackに直接arrow functionを書く
パフォーマンスがよくないので非推奨
componentがrenderされるとき、毎回ちがうcallbackが作成されてしまう
殆どの場合問題がないが、callbackがpropとして下位のcomponentに渡されると、それらも再描画されてしまう
better practice:onClickには対応するhandlerを書こうkadoyau.icon
関連:JavaScriptのthis#5b4870443f44250000da2845
Passing Arguments to Event Handlers
ループ中ではevent handlerにパラメータ(例えばid)を渡したいときがある
code:js
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
これらは等価。arrow functionでもFunction.prototype.bind(下)のどちらも動く
どちらもidに続いてeが渡されている
上は明示的に、下は暗黙的に渡される